#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>

int pid_neto;

void killer(int signo) {

	// Enviar sinal ao filho que está actualmente a correr, para suspender execução.
	kill(pid_neto, SIGKILL);
}


int main(int argc, char * argv[]) {

	if (argc < 4) {
		fprintf(stderr, "Usage: %s <E> <L> [progs]\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	int numeroProgramas = argc - 3;
	int periodoE = atoi(argv[1]);
	int maxL = atoi(argv[2]);

	int i = 0;
	for (i = 0; i < numeroProgramas; i++) {
		int pid2 = fork();
		switch (pid2) {
		case -1:
			perror("fork");
			exit(EXIT_FAILURE);
			break;
		case 0:

			// armadilhar
			signal(SIGALRM, killer);

			alarm(maxL);

			pid_neto = fork();

			if (pid_neto == 0) {
				//passa o nome do programa
				char iStr[2];
				sprintf(iStr, "%d", i);

				execl(argv[i + 3], argv[i + 3], iStr, NULL);
				perror("execlp");
				exit(EXIT_FAILURE);
			} else {
				wait(NULL); //espera que o neto termine, mas neste caso o filho deste aqui
			}


			exit(EXIT_SUCCESS);
		default:
			sleep(periodoE);
			break;
		}
	} // end for

	for (i = 0; i < numeroProgramas; i++) {
		wait(NULL);
	}

	return 0; // :)
}
